#include <string>
#include <cstring>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<iostream>
#include <strings.h>

void Usage(std::string proc)
{
    
    std::cout << "Usage: " << proc << " server_ip server_port" << std::endl;
}

//客服端需要知道服务器的ID和port
// ./udp_client server_ip server_port
int main(int argc,char* argv[])
{
    if(argc != 3)
    {
        Usage(argv[0]);//使用说明
        return 1;
    }
    //通过命令行参数拿到服务器的ip和port
    std::string svr_ip = argv[1];//服务器的IP地址-字符串IP
    uint16_t svr_port = (uint16_t)atoi(argv[2]);//argv[2]是字符串->转为整数,此时是主机序
    
    //1. 创建套接字socket
    int sock = socket(AF_INET, SOCK_STREAM, 0);//TCP采用流式套接
    if(sock < 0)
    {
        std::cerr << "socket error!" << std::endl;
        return 2;
    }
    //2.客户端连接服务器
    struct sockaddr_in server; //填写服务器的网络信息:表示连接哪一个服务器,端口号是多少
    bzero(&server, sizeof(server));//把结构体清0
    server.sin_family = AF_INET;//协议家族
    //inet_addr该函数做两件事情
    //1. 将点分十进制的字符串风格的IP，转化成为4字节IP(一个整数)
    //2. 将4字节IP由主机序列转化成为网络序列
    server.sin_addr.s_addr = inet_addr(svr_ip.c_str()); //svr_ip.c_str():字符串风格的IP地址->转化为4字节的网络大端的IP地址
    server.sin_port = htons(svr_port); // svr.port是主机序->网络字节序

    //连接服务器
    if(connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0)
    {
        std::cout << "connect server failed !" << std::endl;
        return 3;
    }

    std::cout << "connect success!" << std::endl;
    //3.客户端发送请求
    // 进行正常的业务请求了
    while(true)
    {
        std::cout << "Please Enter# ";
        char buffer[1024];
        fgets(buffer, sizeof(buffer)-1, stdin);//读取的内容放到buffer里面

        //向服务端写入数据
        write(sock, buffer, strlen(buffer));

        //读取服务端写回来的数据
        ssize_t s = read(sock, buffer, sizeof(buffer)-1);
        if(s>0)
        {
            buffer[s] = 0;//读取到的内容当成字符串,最后置\0
            std::cout << "server echo# " << buffer << std::endl;
        }
    }    
    return 0;
}
